package com.cy.pj.health.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/*
 *此对象应用处理DispatcherServlet（SpringMVC中的核心处理器）交给他的情求
 */
@Controller//此注解描述的对象为Controller请求的处理器对象，我们通常称之为handler
public class TemplateController {
    /*
     *@RequestMapping注解描述方法时用于定义请求url到handler中方法的映射
     * @return view 的名字
     * 请求地址：http：//localhost：80/doTemplateUI
     * 请求的简易处理过程
     * 1）基于域名获取ip地址（127.1.1.1）
     * 2）基于ip地址找到网络中计算机（ip地址是网络jsj的唯一标识）
     * 3）基于端口找到tomcat服务（port是计算机中应用的唯一标识）
     * 4）tomcat服务会基于thread并借助io读取网络http协议中请求数据
     * 5）tomcat内部会创建请求（request）和响应（respond）对象用于封装请求和响应信息
     * 6）tomcat会调用Filter对象对request数据进行过滤
     * 7）Filter对request过滤后，会将请求交给DispatcherServlet进行处理
     * 8）DispatcherServlet读取请求中url，并基于url从requestMapping中找到对应的handle方法
     * 9）DispatcherServlet基于反射技术调用handle方法
     * 10）DispatcherServlet会将handle方法返回的view等相关信息进行封装，然后交给视图解析器
     * 11）viewResolver视图解析器对为view name添加前缀，后缀，并将model中数据填充到view中
     * 12）DispatcherServlet将视图解析器解析的结果封装到respond对象，并将其响应到客户端
     * 说明：
     * 1)此方法是DispatcherServlet基于反射技术进行调用？
     * 2）反射技术的最大优势？不能预知未来，但可以驾驭未来
     */
    @RequestMapping("/doTempalteUI")
    public String doTempalteUI(Model model){
        model.addAttribute("msg","html Template Page");
        return "default";//view name
        //思考？
        //1）这里的返回值会交给谁？当然是方法的调用者（DispatcherServlet）
        //2）dispatcherServlet会将方法的返回值封装到ModelAndView对象中
        //3）将ModelAndView对象交给视图解析器（ViewResoler）进行解析
        //4）视图解析器对为view name 添加前缀，后缀，并将model中数据填充到view中
        //4.1)默认的前缀为/templates/，默认的后缀为/.html/
    }
    @RequestMapping("/doTempiateModelAndView01")
    public String  doTempiateModelAndView01(Model model){
        model.addAttribute("msg","html template page");
        return "default";
    }
    @RequestMapping("/doTempiateModelAndView02")
    public ModelAndView doTempiateModelAndView02(ModelAndView mv){
        mv.addObject("msg","The Model And View");
        mv.setViewName("default");
        return mv;
    }

}
